package br.com.cinesystem.persistence;

import br.com.cinesystem.entity.Ator;
import br.com.cinesystem.entity.Cinema;
import br.com.cinesystem.entity.Filme;
import br.com.cinesystem.entity.Genero;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


public class FilmeDao extends Dao {

    public FilmeDao() {
    }

    public Filme salvar(Filme f) throws Exception{
        abrirConexao();

        stmt = con.prepareStatement("insert into filme values(null,?,?,?,?,?,?,?,1)");
        stmt.setInt(1, f.getGenero().getIdGenero());
        stmt.setString(2, f.getTitulo());
        stmt.setString(3, f.getDiretor());
        stmt.setInt(4, f.getDuracao());
        stmt.setString(5, f.getIdioma());
        stmt.setString(6, f.getSinopse());
        stmt.setString(7, f.getClassificacao());

        stmt.execute();

        stmt = con.prepareStatement("select LAST_INSERT_ID() as id");

        rs = stmt.executeQuery();

        Filme filme = null;

        if(rs.next()){
            filme = new Filme();
            filme.setIdFilme(rs.getInt("id"));
        }

        fecharConexao();
        return filme;
    }

    public List<Filme> buscarTodos()throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();
        sb.append("SELECT f.idFilme, f.titulo, f.diretor, f.duracao, f.idioma, f.sinopse, f.classificacao, ");
        sb.append("g.idGenero, g.genero ");
        sb.append("FROM filme f INNER JOIN genero g ");
        sb.append("ON f.id_Genero = g.idGenero ");
        sb.append("WHERE f.situacao=1 ORDER BY titulo");

        stmt = con.prepareStatement(sb.toString());

        rs = stmt.executeQuery();

        List<Filme> lista = new ArrayList<Filme>();

        while (rs.next()){

            Filme filme = new Filme();
            filme.setGenero(new Genero());

            filme.setIdFilme(rs.getInt("idFilme"));
            filme.setTitulo(rs.getString("titulo"));
            filme.setDiretor(rs.getString("diretor"));
            filme.getGenero().setIdGenero(rs.getInt("idGenero"));
            filme.getGenero().setGenero(rs.getString("genero"));
            filme.setDuracao(rs.getInt("duracao"));
            filme.setIdioma(rs.getString("idioma"));
            filme.setSinopse(rs.getString("sinopse"));
            filme.setClassificacao(rs.getString("classificacao"));

            lista.add(filme);
        }

        fecharConexao();
        return lista;
    }

    public List<Filme> buscarTodosEmCartaz()throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();

        Date data = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String d = sdf.format(data);

        Calendar termino = Calendar.getInstance();
        termino.setTime(data);
        termino.add(Calendar.DAY_OF_MONTH, 7);

        String dfim = sdf.format(termino.getTime());

        sb.append("SELECT f.idFilme, f.titulo, f.diretor, f.duracao, f.idioma, f.sinopse, f.classificacao, ");
        sb.append("g.idGenero, g.genero ");
        sb.append("FROM filme f INNER JOIN genero g ");
        sb.append("ON f.id_Genero = g.idGenero ");
        sb.append("INNER JOIN sessao s ");
        sb.append("ON s.id_Filme = f.idFilme ");
        sb.append("WHERE f.situacao=1 and s.data>=? and s.data<=? ");
        sb.append("GROUP BY  idfilme,titulo,diretor,duracao,idioma,sinopse,classificacao,idgenero,genero ");
        sb.append("ORDER BY  s.data,f.titulo");

        stmt = con.prepareStatement(sb.toString());
        stmt.setString(1, d);
        stmt.setString(2, dfim);
        rs = stmt.executeQuery();

        List<Filme> lista = new ArrayList<Filme>();

        while (rs.next()){

            Filme filme = new Filme();
            filme.setGenero(new Genero());

            filme.setIdFilme(rs.getInt("idFilme"));
            filme.setTitulo(rs.getString("titulo"));
            filme.setDiretor(rs.getString("diretor"));
            filme.getGenero().setIdGenero(rs.getInt("idGenero"));
            filme.getGenero().setGenero(rs.getString("genero"));
            filme.setDuracao(rs.getInt("duracao"));
            filme.setIdioma(rs.getString("idioma"));
            filme.setSinopse(rs.getString("sinopse"));
            filme.setClassificacao(rs.getString("classificacao"));

            lista.add(filme);
        }

        fecharConexao();
        return lista;
    }
    public List<Filme> buscarProximosLanc()throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();

        Date data = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String d = sdf.format(data);

        Calendar termino = Calendar.getInstance();
        termino.setTime(data);
        termino.add(Calendar.DAY_OF_MONTH, 7);

        String dfim = sdf.format(termino.getTime());

        sb.append("SELECT f.idFilme, f.titulo, f.diretor, f.duracao, f.idioma, f.sinopse, f.classificacao, ");
        sb.append("g.idGenero, g.genero ");
        sb.append("FROM filme f INNER JOIN genero g ");
        sb.append("ON f.id_Genero = g.idGenero ");
        sb.append("INNER JOIN sessao s ");
        sb.append("ON s.id_Filme = f.idFilme ");
        sb.append("WHERE f.situacao=1 and f.idFilme not in(SELECT id_Filme from sessao WHERE data>=? and data<=?) ");
        sb.append(" and s.data>? ");
        sb.append("GROUP BY  idfilme,titulo,diretor,duracao,idioma,sinopse,classificacao,idgenero,genero ");
        sb.append("ORDER BY  s.data,f.titulo");

        stmt = con.prepareStatement(sb.toString());
        stmt.setString(1, d);
        stmt.setString(2, dfim);
        stmt.setString(3, dfim);
        rs = stmt.executeQuery();

        List<Filme> lista = new ArrayList<Filme>();

        while (rs.next()){

            Filme filme = new Filme();
            filme.setGenero(new Genero());

            filme.setIdFilme(rs.getInt("idFilme"));
            filme.setTitulo(rs.getString("titulo"));
            filme.setDiretor(rs.getString("diretor"));
            filme.getGenero().setIdGenero(rs.getInt("idGenero"));
            filme.getGenero().setGenero(rs.getString("genero"));
            filme.setDuracao(rs.getInt("duracao"));
            filme.setIdioma(rs.getString("idioma"));
            filme.setSinopse(rs.getString("sinopse"));
            filme.setClassificacao(rs.getString("classificacao"));

            lista.add(filme);
        }

        fecharConexao();
        return lista;
    }

    public Filme buscar(Filme f) throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();
        sb.append("SELECT f.idFilme, f.titulo, f.diretor, f.duracao, f.idioma, f.sinopse, f.classificacao, ");
        sb.append("g.idGenero, g.genero ");
        sb.append("FROM filme f INNER JOIN genero g ");
        sb.append("ON f.id_Genero = g.idGenero ");
        sb.append("WHERE f.idFilme=?");

        stmt = con.prepareStatement(sb.toString());
        stmt.setInt(1, f.getIdFilme());

        rs = stmt.executeQuery();

        Filme filme = null;

        if(rs.next()){

            filme = new Filme();
            filme.setGenero(new Genero());

            filme.setIdFilme(rs.getInt("idFilme"));
            filme.setTitulo(rs.getString("titulo"));
            filme.setDiretor(rs.getString("diretor"));
            filme.getGenero().setIdGenero(rs.getInt("idGenero"));
            filme.getGenero().setGenero(rs.getString("genero"));
            filme.setDuracao(rs.getInt("duracao"));
            filme.setIdioma(rs.getString("idioma"));
            filme.setSinopse(rs.getString("sinopse"));
            filme.setClassificacao(rs.getString("classificacao"));

        }

        fecharConexao();
        return filme;
    }


    public void alterar(Filme f) throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();

        sb.append("UPDATE filme SET id_Genero=?, titulo=?, diretor=?, duracao=?, ");
        sb.append("idioma=?, sinopse=?, classificacao=? WHERE idFilme=?");

        stmt = con.prepareStatement(sb.toString());

        stmt.setInt(1, f.getGenero().getIdGenero());
        stmt.setString(2, f.getTitulo());
        stmt.setString(3, f.getDiretor());
        stmt.setInt(4, f.getDuracao());
        stmt.setString(5, f.getIdioma());
        stmt.setString(6, f.getSinopse());
        stmt.setString(7, f.getClassificacao());
        stmt.setInt(8, f.getIdFilme());

        stmt.execute();

        fecharConexao();

    }

    public void excluir(Filme f) throws Exception{

        abrirConexao();

        stmt = con.prepareStatement("UPDATE filme SET situacao=0 WHERE idFilme=?");

        stmt.setInt(1, f.getIdFilme());

        stmt.execute();

        fecharConexao();

    }
    
    public void salvarAtorFilme(Filme f, Ator a)throws Exception{
        
        abrirConexao();
        
        stmt = con.prepareStatement("INSERT INTO filmeatores VALUES (null,?,?)");
        stmt.setInt(1, a.getIdAtor());
        stmt.setInt(2, f.getIdFilme());
        
        stmt.execute();
        
        fecharConexao();
        
    }

    public Filme buscarAtorFilme(Filme f)throws Exception{
        
        abrirConexao();
        StringBuilder sb = new StringBuilder();
        
        sb.append("SELECT fa.id_Filme, fa.id_Ator, fa.idFilmeAtores, a.nome ");
        sb.append("FROM filmeatores fa INNER JOIN ator a ");
        sb.append("ON id_Ator = idAtor ");
        sb.append("WHERE id_Filme=?");
        
        stmt = con.prepareStatement(sb.toString());
        stmt.setInt(1, f.getIdFilme());
        
        rs = stmt.executeQuery();
        
        Filme filme = new Filme();
        List<Ator> list = new ArrayList<Ator>();
        Ator ator = null;
        
            while(rs.next()){
                
                ator = new Ator();

                ator.setIdAtor(rs.getInt("id_Ator"));
                ator.setNome(rs.getString("nome"));
            
                list.add(ator);

            }
        
            filme.setAtorList(list);
        
        fecharConexao();
        return filme;

    }
    public void excluirAtorFilme(Filme f)throws Exception{

        abrirConexao();

        stmt = con.prepareStatement("DELETE FROM filmeatores WHERE id_Filme=?");
        
        stmt.setInt(1, f.getIdFilme());

        stmt.execute();

        fecharConexao();

    }

    public List<Cinema> buscarCinema(Filme f)throws Exception{

        abrirConexao();

        StringBuilder sb = new StringBuilder();

        Date data = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String d = sdf.format(data);

        sb.append("SELECT c.idCinema, c.razaoSocial FROM sessao se INNER JOIN sala sa ");
        sb.append("ON se.id_Sala = sa.idSala INNER JOIN cinema c ON sa.id_Cinema = c.idCinema ");
        sb.append("WHERE se.id_Filme=? and sa.situacao=1 and c.situacao=1 and ");
        sb.append("se.situacao=1 and data>=? GROUP BY c.idCinema, c.razaoSocial");

        stmt = con.prepareStatement(sb.toString());
        stmt.setInt(1, f.getIdFilme());
        stmt.setString(2, d);

        rs = stmt.executeQuery();

        List<Cinema> lista = new ArrayList<Cinema>();
        Cinema cine = null;

        while(rs.next()){

            cine = new Cinema();
            cine.setIdCinema(rs.getInt("idCinema"));
            cine.setRazaoSocial(rs.getString("razaoSocial"));

            lista.add(cine);

        }

        fecharConexao();
        return lista;
    }

}
